﻿#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<map>
#include<string>
using namespace std;

//int main()
//{
//	multimap<string, string> mp;
//	mp.insert(make_pair<const string,string>("chinese", "中国人"));
//	mp.insert(make_pair < const string, string>("chinese", "中文"));
//	mp.insert(make_pair < const string, string>("hello", "你好"));
//	for (auto e : mp)
//	{
//		cout << e.first << ":" << e.second << endl;
//	}
//
//	return 0;
//}

//int main()
//{
//	int array[] = { 1,4,3,9,6,4,5,7,7,3 };
//
//	multiset<int> s1(array, array + sizeof(array) / sizeof(array[0]));
//	for (auto& e : s1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}



















//#include <string>
//#include <map>
//void TestMap()
//{
//	map<string, string> m;
//	// 向map中插入元素的方式：
//	// 将键值对<"peach","桃子">插入map中，用pair直接来构造键值对
//	m.insert(pair<string, string>("peach", "桃子"));
//	// 将键值对<"peach","桃子">插入map中，用make_pair函数来构造键值对
//	m.insert(make_pair("banan", "香蕉"));
//	// 借用operator[]向map中插入元素
//	//operator[]的原理是：用<key, T()>构造一个键值对，然后调用insert()函数将该键值对插入到map中
//	//如果key已经存在，插入失败，insert函数返回该key所在位置的迭代器
//	//如果key不存在，插入成功，insert函数返回新插入元素所在位置的迭代器
//	//operator[]函数最后将insert返回值键值对中的value返回
//	// 将<"apple", "">插入map中，插入成功，返回value的引用，将“苹果”赋值给该引用结果，
//	m["apple"] = "苹果";
//	// key不存在时抛异常
//	//m.at("waterme") = "水蜜桃";
//	cout << m.size() << endl;
//	// 用迭代器去遍历map中的元素，可以得到一个按照key排序的序列
//	for (auto& e : m)
//		cout << e.first << "--->" << e.second << endl;
//	cout << endl;
//	// map中的键值对key一定是唯一的，如果key存在将插入失败
//	auto ret = m.insert(make_pair("peach", "桃色"));
//	if (ret.second)
//		cout << "<peach, 桃色>不在map中, 已经插入" << endl;
//	else
//		cout << "键值为peach的元素已经存在：" << ret.first->first << "--->"
//		<< ret.first->second << " 插入失败" << endl;
//	// 删除key为"apple"的元素
//	m.erase("apple");
//	if (1 == m.count("apple"))
//		cout << "apple还在" << endl;
//	else
//		cout << "apple被吃了" << endl;
//}
//
//int main()
//{
//	TestMap();
//
//	return 0;
//}

//int main()
//{
//	map<string, int> mp;
//	cout << mp.empty() << endl;//1:为空
//	mp.insert(make_pair("jiejie", 2021));
//	cout << mp.size() << endl;//1个
//	mp["ning"] = 2018;
////问题：当key不在map中时，通过operator获取对应value时会发生什么问题？
////如果 k 与容器中元素的键匹配，则该函数返回对其映射值的引用。
//	mp["leave"];
////如果 k 与容器中任何元素的键不匹配，则该函数将插入具有该键的新元素，并返回对其映射值的引用。
////请注意，这始终将容器大小增加 1，即使没有为元素分配映射值(默认为零，就像上面添加的leave一样)
//	//（元素是使用其默认构造函数构造的）。
//	for (auto e : mp)
//	{
//		cout << e.first << ":" << e.second << endl;
//	}
//	mp.at("cat");
//	return 0;
//}












//int main()
//{
//	map<string, int> mp1;
//	mp1["jiejie"] = 24;
//	mp1["knight"] = 23;
//	mp1["369"] = 21;
//	map<string, int>::iterator it = mp1.begin();
//	while (it != mp1.end())
//	{
//		cout << it->first << " ";
//		++it;
//	}
//	cout << endl;
//	map<string, int>::const_iterator tp = mp1.cbegin();
//	//cbegin() 和 cend() 返回的是 const 迭代器，这意味着你不能通过这些迭代器更改容器中的元素。
//	//如果你需要更改容器中的元素，你应该使用 begin() 和 end() 函数，它们返回的是非 const 迭代器。
//	while (tp != mp1.cend())
//	{
//		cout << tp->first << " ";
//		++tp;
//	}
//	cout << endl;
//	map<string, int>::reverse_iterator r1 = mp1.rbegin();
//	while (r1 != mp1.rend())
//	{
//		cout << r1->first << " ";
//		++r1;
//	}
//	cout << endl;
//	map<string, int>::const_reverse_iterator d1 = mp1.crbegin();
//	while (d1 != mp1.crend())
//	{
//		cout << d1->first << " ";
//		d1++;
//	}
//	return 0;
//}











//#include<iostream>
//#include<set>
//#include<vector>
//using namespace std;
//int main()
//{
//	/*srand(time(0));*/
//	vector<int> v1;
//	/*for (int i = 0; i < 10; ++i)
//	{
//		int tmp = rand();
//		v1.push_back(tmp);
//	}*/
//	for (int i = 0; i < 10; ++i)
//	{
//		v1.push_back(10 - i);
//	}
//	set<int> s1(v1.begin(), v1.end());
//	//v里面元素为：1 2 3 4 5 6 7 8 9 10
//	
//	cout << s1.insert(5).second << endl;
//	//5存在，插入失败，第二个位置返回false(0);
//	
//	cout << *s1.insert(5).first << endl;
//	//第一个位置返回指向5位置所在的迭代器，故打印时需要解引用（*）；
//	s1.erase(5);//删除第五个元素，即为5
//	for (auto e : s1)
//	{
//		cout << e << " ";
//	}
//
//	cout << endl;//5已经被删除
//	s1.insert(100);
//	for (auto e : s1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	cout << s1.erase(100) << endl;//删除set中对应类型的元素，删除100；返回被删除的个数1
//	for (auto e : s1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	s1.erase(++s1.begin(), --s1.end());//除了头尾全部删除
//	for (auto e : s1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	int arr[] = { 1,2,3,4,5,6 };
//	set<int> first(arr, arr + 3);
//	set<int> second(arr + 3, arr + 6);
//	first.swap(second);//直接交换两个set中的元素
//	for (auto e : first)
//		cout << e << " ";
//	cout << endl;
//	second.clear();
//	cout << second.empty() << endl;
//	cout << *first.find(5) << endl;//返回的是指向5的迭代器，进行解引用打印输出。
//	cout << first.count(7) << endl;//返回7的个数，为零个。
//
//	return 0;
//}










//int main()
//{
//	vector<int> v;
//	for (int i = 10; i >= 0; --i)
//	{
//		v.push_back(i);
//	}
//	set<int> s1;
//	set<int> s2(v.begin(), v.end());
//	set<int> s3 = s2;
//	for (auto e : s3)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	cout << s1.empty() << endl;
//	cout << s3.empty() << endl;
//	cout << s1.size() << endl;
//	cout << s3.size() << endl;
//
// 	return 0;
//}



//int main()
//{
//	vector<int> v;
//	for (int i = 10; i >= 0; --i)
//	{
//		v.push_back(i);
//	}
//	set<int> s(v.begin(), v.end());
//	set<int>::iterator it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//	set<int>::const_iterator tp = s.begin();
//	while (tp != s.end())
//	{
//		cout << *tp << " ";
//		++tp;
//	}
//	cout << endl;
//
//	set<int>::reverse_iterator sp = s.rbegin();
//	while (sp != s.rend())
//	{
//		cout << *sp << " ";
//		++sp;
//	}
//	cout << endl;
//	set<int>::const_reverse_iterator sh = s.rbegin();
//	while (sh != s.rend())
//	{
//		cout << *sh << " ";
//		++sh;
//	}
//	cout << endl;
//	set<int>::const_reverse_iterator ssh = s.crbegin();
//	while (ssh != s.crend())
//	{
//		cout << *ssh << " ";
//		++ssh;
//	}
//
//	return 0;
//}


//int main()
//{
//	vector<int> v;
//	for (int i = 10; i >= 0; --i)
//	{
//		v.push_back(i);
//	}
//	set<int> s1;
//	set<int> s2(v.begin(), v.end());
//	set<int> s3 = s2;
//	for (auto e : s3)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
// 	return 0;
//}


